﻿#define  _CRT_SECURE_NO_WARNINGS 1

//自除数 是指可以被它包含的每一位数整除的数。
//例如，128 是一个 自除数 ，因为 128 % 1 == 0，128 % 2 == 0，128 % 8 == 0。
//自除数 不允许包含 0 。
//给定两个整数 left 和 right ，返回一个列表，列表的元素是范围 [left, right] 内所有的 自除数 。
//来源：力扣（LeetCode）
//链接：https ://leetcode.cn/problems/self-dividing-numbers
//著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
//int* selfDividingNumbers(int left, int right, int* returnSize) {
//    static int arr[10000];
//    *returnSize = 0;
//    int j = 0;
//    int i = 0;
//    for (i = left; i <= right; i++)
//    {
//        int num = i;
//        while (num)
//        {
//            if (num % 10 == 0)
//                break;
//            num /= 10;
//        }
//        if (num != 0)
//            continue;
//        int flag = i;
//        while (flag)
//        {
//            if (i % (flag % 10) != 0)
//                break;
//            flag /= 10;
//        }
//        if (flag == 0)
//        {
//            arr[j] = i;
//            (*returnSize)++;
//            j++;
//        }
//    }
//    return arr;
//}


//给你一个整数数组 nums，返回 数组 answer ，其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
//题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。
//请不要使用除法，且在 O(n) 时间复杂度内完成此题。
//来源：力扣（LeetCode）
//链接：https ://leetcode.cn/problems/product-of-array-except-self
//著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
//暴力求解法 -- 超时
//int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
//    *returnSize = numsSize;
//    static int answer[10000];
//    int i = 0;
//    for (i = 0; i < numsSize; i++)
//    {
//        int mul = 1;
//        int j = 0;
//        for (j = 0; j < numsSize; j++)
//        {
//            if (j != i)
//            {
//                mul *= nums[j];
//            }
//        }
//        answer[i] = mul;
//    }
//    return answer;
//}
//优解
//int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
//    int* answer = (int*)malloc(numsSize * sizeof(int));
//    *returnSize = numsSize;
//    int left = 1;
//    int right = 1;
//    for (int i = 0; i < numsSize; i++)
//    {
//        answer[i] = left;
//        left *= nums[i];
//    }
//    for (int i = numsSize - 1; i >= 0; i--)
//    {
//        answer[i] *= right;
//        right *= nums[i];
//    }
//    return answer;
//}


//
//描述
//写一个函数，求两个整数之和，要求在函数体内不得使用 + 、 - 、 * 、 / 四则运算符号。
//数据范围：两个数都满足 - 10 \le n \le 1000−10≤n≤1000
//进阶：空间复杂度 O(1)O(1)，时间复杂度 O(1)O(1)
//https://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215?tpId=13&tqId=23249&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
//int Add(int num1, int num2) {
//    // write code here
//    int tmp = num1;
//    while (num2)
//    {
//        tmp = num1 ^ num2;
//        num2 = (num1 & num2) << 1;
//        num1 = tmp;
//    }
//    return tmp;
//}


//给你一个含 n 个整数的数组 nums ，其中 nums[i] 在区间[1, n] 内。请你找出所有在[1, n] 范围内但没有出现在 nums 中的数字，并以数组的形式返回结果。
//来源：力扣（LeetCode）
//链接：https ://leetcode.cn/problems/find-all-numbers-disappeared-in-an-array
//著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
//暴力解法
//int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) {
//    int* no_show = (int*)malloc(numsSize * sizeof(int));
//    *returnSize = 0;
//    int k = 0;
//    int i = 1;
//    for (i = 1; i <= numsSize; i++)
//    {
//        int j = 0;
//        for (j = 0; j < numsSize; j++)
//        {
//            if (i == nums[j])
//            {
//                break;
//            }
//        }
//        if (j == numsSize)
//        {
//            no_show[k] = i;
//            k++;
//            *returnSize += 1;
//        }
//    }
//    return no_show;
//}
//优解
//int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) {
//    int* no_show = (int*)malloc(numsSize * sizeof(int));
//    *returnSize = 0;
//    int i = 0;
//    for (i = 0; i < numsSize; i++)
//    {
//        if (nums[abs(nums[i]) - 1] > 0)
//            nums[abs(nums[i]) - 1] = -nums[abs(nums[i]) - 1];
//    }
//    for (i = 0; i < numsSize; i++)
//    {
//        if (nums[i] > 0)
//        {
//            no_show[*returnSize] = i + 1;
//            *returnSize += 1;
//        }
//    }
//    return no_show;
//}



